import plugin from '../../../lib/plugins/plugin.js';
import fs from 'fs';
import YAML from 'yaml';
import puppeteer from "../../../lib/puppeteer/puppeteer.js";

export class Config extends plugin {
    constructor() {
        super({
            name: '基础配置文件修改',
            dsc: "",
            event: 'message', // 监听的事件类型
            priority: 2000, // 事件优先级
            rule: [
                {
                    reg: "^#获取配置$",
                    fnc: "getConfig",
                    permission: 'master' // 执行权限
                }
            ]
        });
    }

    async getConfig(e) {
        let html = '';

        try {
            // 获取指定目录下所有的yaml配置文件内容
            const files = fs.readdirSync('config/config').filter(file => file.endsWith('.yaml')); // 只读取yaml文件

            if (files.length === 0) {
                return e.reply("没有找到任何配置文件。");
            }

            for (const file of files) {
                const content = fs.readFileSync(`config/config/${file}`, 'utf8'); // 读取yaml文件内容
                const config = YAML.parse(content); // 解析yaml文件内容

                html += `
                    <div class="config-section">
                    <h2>${file}</h2>
                    <table>
                `;

                // 递归处理配置数据
                html += this.parseConfigRecursive(config);

                html += `
                    </table>
                    </div>
                `;
            }

            const data = {
                tplFile: './plugins/administration-plugin/resources/html/config.html',
                config: html
            };

            const img = await puppeteer.screenshot("admin", data);
            return e.reply(img);
        } catch (error) {
            logger.error("获取配置时发生错误: " + error);
            return e.reply("获取配置时发生错误: 请确保配置文件格式正确。"); // 发送更友好的错误信息
        }
    }

    parseConfigRecursive(config, parentKey = '') {
        let html = '';
        const keys = Object.keys(config);

        for (const key of keys) {
            let value = config[key];
            const displayKey = parentKey ? `${parentKey}.${key}` : key; // 构造显示的键

            if (typeof value === 'object' && value !== null) {
                // 处理数组或嵌套对象
                if (Array.isArray(value)) {
                    html += `<tr><th>${displayKey}</th><td>${JSON.stringify(value.length === 1 ? value[0] : value)}</td></tr>`;
                } else {
                    html += this.parseConfigRecursive(value, displayKey); // 递归调用
                }
            } else {
                // 判断敏感数据
                if (isSensitiveData(key)) {
                    value = "******";
                }
                html += `
                    <tr>
                        <th>${displayKey}</th>
                        <td>${value == null ? '配置信息为空' : value}</td>
                    </tr>
                `;
            }

            // 追加配置详细描述
            const description = this.parseConfigDescription(key);
            if (description) {
                html += `<tr><td class="explanation" colspan="2">${description}</td></tr>`;
            }
        }
        return html;
    }

    // 获取配置项描述
    parseConfigDescription(key) {
        const configDescriptions = {
            "log_level": '日志等级:trace,debug,info,warn,fatal,mark,error,off',
            "ignore_self": '群聊和频道中过滤自己的消息 ',
            "resend": '被风控时是否尝试用分片发送 ',
            "sendmsg_error": '发送消息错误时是否通知主人 ',
            "restart_port": '重启时使用的端口 ',
            "ffmpeg_path": 'ffmpeg的路径 ',
            "ffprobe_path": 'ffprobe的路径',
            "chromium_path": 'chromium的路径 ',
            "puppeteer_ws": 'puppeteer接口地址',
            "puppeteer_timeout": 'puppeteer截图超时时间 ',
            "proxyAddress": '米游社接口代理地址，国际服用',
            "online_msg": '上线时给首个主人QQ推送帮助 ',
            "online_msg_exp": "上线推送通知的冷却时间",
            "skip_login": "是否跳过登录ICQQ ",
            "sign_api_addr": 'qq签名接口地址 ',
            "ver": '版本号 ',
            "slider_ticket_addr": '滑块验证地址 ',
            "groupGlobalCD": "群聊中所有指令操作冷却时间，单位毫秒,0则无限制",
            "singleCD": "单条指令操作冷却时间，单位毫秒,0则无限制",
            "onlyReplyAt": "仅允许@机器人回复 ",
            "botAlias": "开启后则只回复@机器人的消息及特定前缀的消息，支持多个",
            "imgAddLimit": "添加表情是否限制  0-所有群员都可以添加 1-群管理员才能添加 2-主人才能添加",
            "imgMaxSize": "添加表情图片大小限制，默认2m",
            "addPrivate": "是否允许私聊添加表情",
            "enable": "是否启用插件 ",
            "disable": "禁用功能，功能名称,例如：云崽帮助、角色素材、今日素材、养成计算、米游社公告",
            "groupGlobalCD": "群聊中所有指令操作冷却时间，单位毫秒,0则无限制",
            "singleCD": "单条指令操作冷却时间，单位毫秒,0则无限制",
            "iyuu": "IYUU(https://iyuu.cn/)",
            "sct": "Server酱(https://sct.ftqq.com/)",
            "feishu_webhook": "飞书自定义机器人Webhook (https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot)",
            "autoFriend": "是否自动拉入好友 ",
            "autoQuit": "是否自动退群人数，当被好友拉进群时，群人数小于配置值自动退出， 默认50，0则不处理",
            "masterQQ": "机器人主人QQ号 ",
            "disableGuildMsg": "禁用频道功能 true: 不接受频道消息，flase：接受频道消息",
            "disablePrivate": "禁用私聊功能 true: 不接受私聊消息，flase：接受私聊消息",
            "disableMsg": "禁用私聊Bot提示内容",
            "disableAdopt": "私聊通行字符串",
            "whiteGroup": "白名单群号",
            "whiteQQ": "白名单QQ号",
            "blackGroup": "黑名单群号",
            "blackQQ": "黑名单QQ号",
            "qq": "隐私数据",
            "pwd": "隐私ata",
            "platform": "1:安卓手机、 2:aPad 、 3:安卓手表、 4:MacOS 、 5:iPad 、 6:Tim",
            "host": "隐私数据",
            "port": "隐私数据",
            "username": "隐私数据",
            "password": "隐私数据",
            "db": "隐私数据",
            "name": "渲染后端, 默认为 puppeteer"
        };
        return configDescriptions[key] || '';
    }
}

// 判断是否是敏感数据的函数
function isSensitiveData(key) {
    const sensitiveKeys = ["pwd", "qq", "sign_api_addr", "host", "port", "username", "password", "db"];
    return sensitiveKeys.includes(key);
}
